﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Controls.DataVisualization.Charting;


namespace Galaktika.BI.Charting
{   

    public class PaletteCollection : Collection<PaletteChart>
    {      

        //public int Add(PaletteChart paletteItem)
        //{
        //    return this.List.Add(paletteItem);
        //}

        /// <summary>
        /// Добавляет массив палитр в конец коллекции
        /// </summary>
        public void AddRange(PaletteChart[] paletteArray)
        {
            foreach (var chart in paletteArray)
            {
                base.Items.Add(chart);
            }           
        }

        public bool ContainsPalette(PaletteChart paletteItem)
        {
            return this.Items.Contains(paletteItem);
        }

        public void Assign(PaletteCollection collection)
        {
            if (collection == null)
            {
                throw new ArgumentNullException("collection");
            }
            base.Items.Clear();
            foreach (PaletteChart paletteSource in collection)
            {
                PaletteChart paletteNew = (PaletteChart)paletteSource.Clone();
                base.Items.Add(paletteNew);
            }
        }

        /// <summary>
        /// Сортирует коллекцию
        /// </summary>
        //public void Sort()
        //{
        //    base.Items.Sort();
        //}

        /// <summary>
        /// Создает массив элементов PaletteChart
        /// </summary>        
        //public PaletteChart[] ToArray()
        //{
        //    return (PaletteChart[])base.Items.ToArray(typeof(PaletteChart));
        //}

        /// <summary>
        /// Создает копию коллекции
        /// </summary>
        public PaletteCollection Clone()
        {
            PaletteCollection collectResult = new PaletteCollection();
            foreach (PaletteChart palette in this)
            {
                PaletteChart item = (PaletteChart)palette.Clone();
                collectResult.Add(item);
            }

            return collectResult;
        }

        public int IndexOfPalette(PaletteChart paletteItem)
        {
            return this.Items.IndexOf(paletteItem);
        }

        public void InsertPalette(int index, PaletteChart paletteItem)
        {
            this.Items.Insert(index, paletteItem);
        }

        public void RemovePalette(PaletteChart paletteItem)
        {
            this.Items.Remove(paletteItem);
        }

        /// <summary>
        /// Копирует существующую коллекцию в массив seriesArray
        /// </summary>
        public void CopyPaletteTo(PaletteChart[] paletteArray)
        {
            base.Items.CopyTo(paletteArray,0);
        }

        /// <summary>
        /// Копирует существующуюю коллекцию в массив seriesArray,
        /// начиная с индекса arrayIndex
        /// </summary>
        public void CopyPaletteTo(PaletteChart[] paletteArray, int arrayIndex)
        {
            base.Items.CopyTo(paletteArray, arrayIndex);
        }

        public PaletteChart this[int index]
        {
            get
            {
                return (PaletteChart)this.Items[index];
            }
        }

        /// <summary>
        /// Возвращает уникальное имя палитры в рамках коллекции
        /// </summary>
        /// <returns></returns>
        public string GenerateUniqueName()
        {
            return this.GenerateUniqueName(string.Empty);
        }

        /// <summary>
        /// Возвращает уникальное имя палитры в рамках коллекции
        /// </summary>
        /// <param name="namePrefix">Префикс имени, с которого будет начинаться имя палитры</param>
        /// <returns></returns>
        public string GenerateUniqueName(string namePrefix)
        {
            if (string.IsNullOrEmpty(namePrefix))
            {
                namePrefix = this.Prefix;
            }

            string uniqueNameResult = namePrefix;
            int indexMax = 1000;
            List<string> collectionNames = new List<string>(this.GetNames());

            for (int index = 1; index < indexMax; index++)
            {
                uniqueNameResult = namePrefix + index.ToString();
                if (!collectionNames.Contains(uniqueNameResult))
                {
                    return uniqueNameResult;
                }
            }

            return namePrefix;
        }

        private string m_NamePrefix = "Palette ";
        public string Prefix
        {
            get
            {
                return m_NamePrefix;
            }
        }

        public string[] GetNames()
        {
            List<string> collectionNames = new List<string>();

            foreach (PaletteChart palette in this.Items)
            {
                collectionNames.Add(palette.Name);
            }

            return collectionNames.ToArray();
        }

        //Событие - изменение коллекции
        public event EventHandler PaletteCollectionModified;

        public void RaisePaletteCollectionModified()
        {
            EventHandler handler = PaletteCollectionModified;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }
    }
}
